package io.renren.sdapi.dto.httprequestparam;

import io.renren.enums.SamplerNameEnum;
import io.renren.enums.ScheduleTypeEnum;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotNull;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 调用sd text2image接口请求参数体
 */
@Data
@Schema(description = "文本转图片请求参数")
public class Text2ImageRequestParam {

    private List<Map<String, String>> lora;

    /**
     * 提示词
     * 这是输入到模型中的文本描述，用于指导模型生成相应的图像。提示词可以包含对图像内容的详细描述、风格、情感等
     */
    @NotNull
    @Schema(description = "提示词")
    private String prompt;

    /**
     * 反向提示词
     * 这是输入到模型中的文本描述，用于指导模型生成与提示词相反的图像。
     */
    @Schema(description = "反向提示词")
    private String negative_prompt;

    /**
     * 通常用于指定或影响生成图像的风格如[watercolor(水彩),impressionism(印象主义)]
     */
//    @Schema(description = "通常用于指定或影响生成图像的风格如[watercolor(水彩),impressionism(印象主义)]")
//    private String[] styles;

    /**
     * 随机种子，用于控制生成的图像的随机性，设置相同的种子可以得到相同的结果，默认-1
     */
    @Schema(description = "随机种子，用于控制生成的图像的随机性，设置相同的种子可以得到相同的结果，默认-1")
    private int seed = -1;

    /**
     * 子随机种子，用于控制生成的图像的随机性，设置相同的子随机种子可以得到相同的结果作为seed的补充，默认-1
     */
//    @Schema(description = "子随机种子，用于控制生成的图像的随机性，设置相同的子随机种子可以得到相同的结果作为seed的补充，默认-1")
//    private int subseed = -1;

    /**
     * 非标准参数，可忽略
     */
//    @Schema(description = "非标准参数，可忽略")
//    private int subseed_strength = 0;

    /**
     * 非标准参数，可忽略
     */
//    @Schema(description = "非标准参数，可忽略")
//    private int seed_resize_from_h = -1;

    /**
     * 非标准参数，可忽略
     */
//    @Schema(description = "非标准参数，可忽略")
//    private int seed_resize_from_w = -1;

    /**
     * 采样器名称--》SamplerNameEnum
     */
    @Schema(description = "采样器名称--》SamplerNameEnum")
    private String sampler_name = SamplerNameEnum.DPM_2_M.getName();

    /**
     * 调度器 --》ScheduleTypeEnum
     */
    @Schema(description = "调度器 --》ScheduleTypeEnum")
    private String scheduler = ScheduleTypeEnum.Automatic.getName();

    /**
     * 每批生成的图片数
     */
    @Schema(description = "每批生成的图片数")
    private  int batch_size = 1;

    /**
     * 生成批次
     */
    @Schema(description = "生成批次")
    private int n_iter = 1;

    /**
     * 生成步数
     */
    @Schema(description = "生成步数")
    private int steps = 20;

    /**
     * 提示词相关性(CFG Scale/无分类器信息引导规模)
     */
    @Schema(description = "提示词相关性(CFG Scale/无分类器信息引导规模")
    private int cfg_scale = 7;

    /**
     * 宽度
     */
    @Schema(description = "宽度")
    private int width = 512;

    /**
     * 高度
     */
    @Schema(description = "高度")
    private int height = 512;

    /**
     * 是否恢复人脸，面部修复
     */
//    @Schema(description = "是否恢复人脸，面部修复")
//    private boolean restore_faces = true;

    /**
     * 是否平铺
     */
//    @Schema(description = "是否平铺")
//    private boolean tiling = false;

    /**
     * 是否保存生成结果
     */
//    @Schema(description = "是否保存生成结果")
//    private boolean do_not_save_samples = false;

    /**
     * 是否将生成的结果以网格形式保存到一个文件中（如PNG或JPEG）
     */
//    @Schema(description = "是否将生成的结果以网格形式保存到一个文件中（如PNG或JPEG）")
//    private boolean do_not_save_grid = false;

    /**
     * 预计完成时间
     */
//    @Schema(description = "预计完成时间")
//    private int eta = 0;

    /**
     * 降噪强度
     */
//    @Schema(description = "降噪强度")
//    private int denoising_strength = 0;

    /**
     * 无条件生成的最小比例或阈值（非标准参数，可能特定于实现）
     */
//    @Schema(description = "无条件生成的最小比例或阈值（非标准参数，可能特定于实现）")
//    private int s_min_uncond = 0;

    /**
     * 用于控制生成过程中的某种“变化”或“更新”速率（非标准参数）
     */
//    @Schema(description = "用于控制生成过程中的某种“变化”或“更新”速率（非标准参数）")
//    private int s_churn = 0;

    /**
     * 与生成过程相关的某个时间或温度参数的最大值
     */
//    @Schema(description = "与生成过程相关的某个时间或温度参数的最大值")
//    private int s_tmax = 0;

    /**
     * 与生成过程相关的某个时间或温度参数的最小值
     */
//    @Schema(description = "与生成过程相关的某个时间或温度参数的最小值")
//    private int s_tmin = 0;

    /**
     * 初始噪声水平，影响生成过程的起始点
     */
//    @Schema(description = "初始噪声水平，影响生成过程的起始点")
//    private int s_noise = 0;

    /**
     * 覆盖默认设置
     */
    @Schema(description = "覆盖默认设置")
    private Map<String, String> override_settings;

    /**
     * 生成结果后是否恢复之前的设置
     */
//    @Schema(description = "生成结果后是否恢复之前的设置")
//    private boolean override_settings_restore_afterwards = true;

    /**
     * 细化器检查点路径，用于进一步提高图像质量
     */
//    @Schema(description = "细化器检查点路径，用于进一步提高图像质量")
//    private String refiner_checkpoint;

    /**
     * 切换到细化器的步骤或迭代次数
     */
//    @Schema(description = "切换到细化器的步骤或迭代次数")
//    private int refiner_switch_at = 0;

    /**
     * 是否禁用额外的网络或功能
     */
//    @Schema(description = "是否禁用额外的网络或功能")
//    private boolean disable_extra_networks = false;

    /**
     * 第一遍生成时使用的图像路径
     */
//    @Schema(description = "附加的注释或元数据")
//    private String firstpass_image;

    /**
     * 附加的注释或元数据
     */
    //private List<String> comments;

    /**
     * 是否开启高清
     */
//    @Schema(description = "是否开启高清")
//    private boolean enable_hr = false;

    /**
     * 第一阶段生成时的图像宽度
     */
//    @Schema(description = "第一阶段生成时的图像宽度")
//    private int firstpass_width = 0;

    /**
     * 第一阶段生成时的图像高度
     */
//    @Schema(description = "第一阶段生成时的图像高度")
//    private int firstpass_height = 0;

    /**
     * 放大倍率
     */
//    @Schema(description = "放大倍率")
//    private int hr_scale = 2;

    /**
     * 放大算法
     */
//    @Schema(description = "放大算法")
//    private String hr_upscaler = UpScalarEnum.Latent.getName();

    /**
     * 高分辨率生成第二遍时的步骤数
     */
//    @Schema(description = "高清分辨率生成第二遍时的步骤数")
//    private int hr_second_pass_steps = 0;

    /**
     * 高分辨率下宽度调整到多少
     */
//    @Schema(description = "高分辨率下宽度调整到多少")
//    private int hr_resize_x = 0;

    /**
     * 高分辨率下高度调整到多少
     */
//    @Schema(description = "高分辨率下高度调整到多少")
//    private int hr_resize_y = 0;

    /**
     * 高分辨率生成时使用的检查点名称(应该是模型)
     */
//    @Schema(description = "高分辨率生成时使用的检查点名称(应该是模型)")
//    private String hr_checkpoint_name;

    /**
     * 高分辨率下的采样器
     */
//    @Schema(description = "高分辨率下的采样器")
//    private String hr_sampler_name;

    /**
     * 高分辨率下的调度器
     */
//    @Schema(description = "高分辨率下的调度器")
//    private String hr_scheduler;

    /**
     * 高分辨率下的提示词
     */
//    @Schema(description = "高分辨率下的提示词")
//    private String hr_prompt;

    /**
     * 高分辨率下的负面提示词
     */
//    @Schema(description = "高分辨率下的负面提示词")
//    private String hr_negative_prompt;

    /**
     * 高分辨率下的降噪强度
     */
//    @Schema(description = "高分辨率下的降噪强度")
//    private int hr_denoising_strength = 0;

    /**
     * 强制任务ID
     */
//    @Schema(description = "强制任务ID")
//    private String force_task_id;

    @Schema(description = "这我也不知道是什么参数")
    private String sampler_index = "Euler";

    /**
     * 要运行的脚本名称（可能用于自定义生成过程）
     */
//    @Schema(description = "要运行的脚本名称（可能用于自定义生成过程）")
//    private String script_name;

    /**
     * 传递给脚本的参数列表
     */
//    @Schema(description = "传递给脚本的参数列表")
//    private String[] script_args;

    /**
     * 是否发送生成的图像
     */
//    @Schema(description = "是否发送生成的图像")
//    private boolean send_images = true;

    /**
     * 是否保存生成的图像
     */
    @Schema(description = "是否保存生成的图像")
    private boolean save_images = true;

    /**
     * 脚本参数
     */
    //private List<String> alwayson_scripts;

    /**
     * 提示词（图像生成的附加说明）
     */
//    @Schema(description = "提示词（图像生成的附加说明）")
//    private String infotext;
}
